# 多线程成多个小说简介
import json
import os
import random

from colorama import Fore, init

from AI接口.DeepSeekAPI import DeepSeekClient
from settings import DEEPSEEK_API_KEY
from 小说的类型和例子 import 小说的分类

init()

system_prompt = """
        The user will provide some exam text. Please parse the "novels" and output them in JSON format. 

        EXAMPLE INPUT: 
        生成几个和腕表有关的小说和小说简介.

        EXAMPLE JSON OUTPUT:
        {
            "novels": [
                {
                    "title": "时间囚笼：我的手表能重启人生",
                    "genre": "都市奇幻",
                    "description": "林默从未想过，一块破旧的机械表会彻底改变他的人生。那是一个阴雨绵绵的午后，他在古董店避雨时，老板神秘兮兮地将这块表塞给了他。表盘上刻着古怪的纹路，指针永远停在午夜十二点。第一次转动表冠是在他目睹女友车祸的瞬间。时间倒流，他成功救下了她，却发现母亲因此突发心脏病离世。第二次，他挽救了母亲，却导致整个街区陷入火灾。每一次重启，都像是打开了一个潘多拉魔盒，命运的齿轮在看不见的地方悄然转动。更可怕的是，他发现自己的记忆开始出现裂痕，有时分不清现实与重启前的世界。而那块表，似乎正在吸取他的生命力，表盘上的纹路越来越像他掌心的纹路。在无数次的时间循环中，林默逐渐意识到，这不是命运的馈赠，而是一场精心设计的囚笼。表盘上的十二个刻度，暗示着他仅剩的十二次重启机会。而最后一次重启，等待他的将是永恒的困局。"
                },
            ]
        }
        """


def get_novel_description():
    # JSON格式调用
    deepseek_client = DeepSeekClient(api_key=DEEPSEEK_API_KEY)

    response = deepseek_client.chat(
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": f"生成一个和腕表有关的小说和小说简介,简介在250-300自之间，参考例子的结构，但是不要和例子一样。小说类型{random.choice(小说的分类)}(随机数={random.randint(0, 1000000)})"},
        ],
        temperature=1.5,
    )
    try:
        json_result = json.loads(deepseek_client.get_result(response))
        print(response)
    except json.JSONDecodeError:
        print(f"{Fore.RED}JSON解析错误")
        print(response)
        print(Fore.RESET)
        return
    print(json_result)

    # 判断小说文本文件夹有没有存在，如果没有就创建
    dir_name = "小说文本"
    if not os.path.exists(dir_name):
        os.mkdir(dir_name)
    # 把文本放到一个文件夹里面
    with open(f"{dir_name}/{json_result["novels"][0]["title"]}({json_result["novels"][0]["genre"]}).txt", "w", encoding="utf-8") as f:
        f.write(json_result["novels"][0]["description"])


if __name__ == "__main__":
    from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(get_novel_description) for _ in range(5)]
    for future in futures:
        try:
            future.result()
        except Exception as e:
            print(f"{Fore.RED}线程执行错误: {e}{Fore.RESET}")

